15min_adventure - cr3 2024
入力された文字列に対して何回かxorをした後、バイナリ内の定数と比較している
デコンパイル結果から正しい入力を復元するとcr3{c0ngr4t5_0n_f1nd1ng_th3_fake_flag}が得られる
フラグから分かる通り、これはfake flag
バイナリの挙動をデバッガで追うと、RtlCaptureContextで関数を呼び出していることがわかる(sub_1400017E0)
この関数でもxorおよびrorをしていることがわかるので、これを考慮して正しい入力を復元すると正しいフラグが得られる
code: solve.py
arr1 = b''.join([int.to_bytes(it & 0xffffffffffffffff, 8, 'little') for it in a::-1]) arr2 = b''.join([int.to_bytes(it & 0xffffffffffffffff, 8, 'little') for it in b::-1]) arr3 = b''.join([int.to_bytes(it & 0xffffffffffffffff, 8, 'little') for it in c::-1]) ror = lambda val, r_bits, max_bits: \
((val & (2**max_bits-1)) >> r_bits%max_bits) | \
(val << (max_bits-(r_bits%max_bits)) & (2**max_bits-1))
flag1 = [arr1i ^ arr2i for i in range(len(arr1))] print(flag1)
flag2 = [ror(flag1i, 2, 8) ^ (arr3i + i) ^ i for i in range(len(flag1))] print(flag2)
flag3 = [chr((flag2i ^ 0x66) & 0xff) for i in range(len(flag2))] print(''.join(flag3))